package br.com.cinesystem.control;

import br.com.cinesystem.persistence.Dao;
import br.com.cinesystem.persistence.VendaDao;
import br.com.cinesystem.util.ReportUtils;
import java.io.*;
import java.util.*;
import java.sql.*;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.*;
import javax.servlet.http.*;
import net.sf.jasperreports.engine.JRException;


public class GerarRelatorio extends HttpServlet {
   
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException, Exception {
        response.setContentType("text/html;charset=ISO-8859-1");
        
        String cmd = request.getParameter("cmd");
        PrintWriter out = response.getWriter();
        OutputStream outStream = null;

        if(cmd.equals("relcinemas")){

            Dao d = new Dao();
            // obtém o relatório compilado
            InputStream inputStream = getClass().getResourceAsStream( "/cinemas.jasper" );
            
            // preenche o mapa de parâmetros
            Map<String, Object> parametros = new HashMap<String, Object>();
            parametros.put( "vazio", "vazio" );

            try {
                // gera o relatório e atribui o OutputStream gerado
                outStream = ReportUtils.createPDFReport(inputStream,parametros,d.getReportConection(),response);

            } catch ( SQLException exc ) {
                exc.printStackTrace();
            } catch ( JRException exc ) {
                exc.printStackTrace();
            } finally {

                // se não aconteceu nenhum problema, fecha o output stream
                if ( outStream != null ) {
                    outStream.close();
                }

            }
        }
        if(cmd.equals("relclientes")){

            Dao d = new Dao();
            // obtém o relatório compilado
            InputStream inputStream = getClass().getResourceAsStream( "/relclientes.jasper" );

            // preenche o mapa de parâmetros
            Map<String, Object> parametros = new HashMap<String, Object>();
            parametros.put( "vazio", "vazio" );

            try {
                // gera o relatório e atribui o OutputStream gerado
                outStream = ReportUtils.createPDFReport(inputStream,parametros,d.getReportConection(),response);

            } catch ( SQLException exc ) {
                exc.printStackTrace();
            } catch ( JRException exc ) {
                exc.printStackTrace();
            } finally {

                // se não aconteceu nenhum problema, fecha o output stream
                if ( outStream != null ) {
                    outStream.close();
                }

            }
        }
        if(cmd.equals("relcolaboradores")){

            Dao d = new Dao();
            // obtém o relatório compilado
            InputStream inputStream = getClass().getResourceAsStream( "/relfuncionarios.jasper" );

            // preenche o mapa de parâmetros
            Map<String, Object> parametros = new HashMap<String, Object>();
            parametros.put( "vazio", "vazio" );

            try {
                // gera o relatório e atribui o OutputStream gerado
                outStream = ReportUtils.createPDFReport(inputStream,parametros,d.getReportConection(),response);

            } catch ( SQLException exc ) {
                exc.printStackTrace();
            } catch ( JRException exc ) {
                exc.printStackTrace();
            } finally {

                // se não aconteceu nenhum problema, fecha o output stream
                if ( outStream != null ) {
                    outStream.close();
                }

            }
        }
        if(cmd.equals("relfilmes")){

            Dao d = new Dao();
            // obtém o relatório compilado
            InputStream inputStream = getClass().getResourceAsStream( "/relfilmes.jasper" );

            // preenche o mapa de parâmetros
            Map<String, Object> parametros = new HashMap<String, Object>();
            parametros.put( "vazio", "vazio" );

            try {
                // gera o relatório e atribui o OutputStream gerado
                outStream = ReportUtils.createPDFReport(inputStream,parametros,d.getReportConection(),response);

            } catch ( SQLException exc ) {
                exc.printStackTrace();
            } catch ( JRException exc ) {
                exc.printStackTrace();
            } finally {

                // se não aconteceu nenhum problema, fecha o output stream
                if ( outStream != null ) {
                    outStream.close();
                }

            }
        }
        if(cmd.equals("relsalas")){

            Dao d = new Dao();
            // obtém o relatório compilado
            InputStream inputStream = getClass().getResourceAsStream( "/relsalas.jasper" );

            // preenche o mapa de parâmetros
            Map<String, Object> parametros = new HashMap<String, Object>();
            parametros.put( "vazio", "vazio" );

            try {
                // gera o relatório e atribui o OutputStream gerado
                outStream = ReportUtils.createPDFReport(inputStream,parametros,d.getReportConection(),response);

            } catch ( SQLException exc ) {
                exc.printStackTrace();
            } catch ( JRException exc ) {
                exc.printStackTrace();
            } finally {

                // se não aconteceu nenhum problema, fecha o output stream
                if ( outStream != null ) {
                    outStream.close();
                }

            }
        }
        if(cmd.equals("relsessoes")){

            Dao d = new Dao();
            // obtém o relatório compilado
            InputStream inputStream = getClass().getResourceAsStream( "/relsessoes.jasper" );

            // preenche o mapa de parâmetros
            Map<String, Object> parametros = new HashMap<String, Object>();
            parametros.put( "vazio", "vazio" );

            try {
                // gera o relatório e atribui o OutputStream gerado
                outStream = ReportUtils.createPDFReport(inputStream,parametros,d.getReportConection(),response);

            } catch ( SQLException exc ) {
                exc.printStackTrace();
            } catch ( JRException exc ) {
                exc.printStackTrace();
            } finally {

                // se não aconteceu nenhum problema, fecha o output stream
                if ( outStream != null ) {
                    outStream.close();
                }

            }
        }
        if(cmd.equals("imprimirIngresso")){

            Dao d = new Dao();
            // obtém o relatório compilado
            InputStream inputStream = getClass().getResourceAsStream( "/ingressos.jasper" );

            // preenche o mapa de parâmetros
            Map<String, Object> parametros = new HashMap<String, Object>();
            parametros.put( "idVenda", Integer.parseInt(request.getParameter("id")));

            try {
                // gera o relatório e atribui o OutputStream gerado
                outStream = ReportUtils.createPDFReport(inputStream,parametros,d.getReportConection(),response);

            } catch ( SQLException exc ) {
                exc.printStackTrace();
            } catch ( JRException exc ) {
                exc.printStackTrace();
            } finally {

                // se não aconteceu nenhum problema, fecha o output stream
                if ( outStream != null ) {
                    outStream.close();
                }

            }
        }
        if(cmd.equals("relvendas")){

            Dao d = new Dao();
            // obtém o relatório compilado
            InputStream inputStream = getClass().getResourceAsStream( "/relvendas.jasper" );

            // preenche o mapa de parâmetros
            Map<String, Object> parametros = new HashMap<String, Object>();

            if(request.getParameter("dataInicial").isEmpty()){
                request.setAttribute("mensagem", "A data inicial é um campo obrigatório!");
                request.getRequestDispatcher("erro_data.jsp").forward(request, response);
            }else{
                if(request.getParameter("dataFinal").isEmpty()){
                    request.setAttribute("mensagem", "A data final é um campo obrigatório!");
                    request.getRequestDispatcher("erro_data.jsp").forward(request, response);
                }else{

                    String d1 = request.getParameter("dataInicial");
                    String d2 = request.getParameter("dataFinal");

                    String vetor[] = d1.split("/");
                    String vetor2[] = d2.split("/");

                    SimpleDateFormat sdf = new SimpleDateFormat();
                    java.util.Date dIni = new java.util.Date(vetor[1]+"/"+vetor[0]+"/"+vetor[2]);
                    java.util.Date dFim = new java.util.Date(vetor2[1]+"/"+vetor2[0]+"/"+vetor2[2]);

                    Calendar dataI = Calendar.getInstance();
                    Calendar dataF = Calendar.getInstance();

                    dataI.setTime(dIni);
                    dataF.setTime(dFim);

                    if(dataI.after(dataF)){

                        request.setAttribute("mensagem", "A data inicial não pode ser maior do que a data final!");
                        request.getRequestDispatcher("erro_data.jsp").forward(request, response);

                    }else{

                        VendaDao vd = new VendaDao();
                        Boolean b = vd.verificarPeriodo(dIni, dFim);

                        if(b.equals(Boolean.FALSE)){
                            request.setAttribute("mensagem", "Nenhum registro encontrado!");
                            request.getRequestDispatcher("erro_data.jsp").forward(request, response);
                        }else{
                            parametros.put( "dataInicial", dIni);
                            parametros.put( "dataFinal", dFim);

                            try {
                                // gera o relatório e atribui o OutputStream gerado
                                outStream = ReportUtils.createPDFReport(inputStream,parametros,d.getReportConection(),response);

                            } catch ( SQLException exc ) {
                                exc.printStackTrace();
                            } catch ( JRException exc ) {
                                exc.printStackTrace();
                            } finally {

                                // se não aconteceu nenhum problema, fecha o output stream
                                if ( outStream != null ) {
                                    outStream.close();
                                }

                            }
                        }
                    }
                }
            }
        }
    } 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (Exception ex) {
            Logger.getLogger(GerarRelatorio.class.getName()).log(Level.SEVERE, null, ex);
        }
    } 

    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (Exception ex) {
            Logger.getLogger(GerarRelatorio.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public String getServletInfo() {
        return "Short description";
    }

}
